package com.struts.validator;

import com.opensymphony.xwork2.validator.ValidationException;
import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;

/**
 * 自定义校验器：
 * 		验证一个字符串是否含有中文字符
 * 		方法：比较字符串的字节数和字符数，就可以知道字符串中是否有中文字符了，如果字节数大于字符数，那么肯定包含了中文字符
 * @author LC
 *
 */
public class ChineseValidator extends FieldValidatorSupport{

	 /** 
     * 表示是否包含有中文。现在有三种模式： 
     * none 没有中文字符 
     * some 含有中文字符,默认值 
     * all  全是中文字符 
     */  
    private String mode = "some";  
    public void setMode(String mode) {  
        this.mode = mode;  
    }  
      
    public void validate(Object object) throws ValidationException {            //获取字段名  
    	//获取被验证的字段名
        final String fieldName = this.getFieldName();  
        //获取字段值  
        final String fieldValue = (String) this.getFieldValue(fieldName, object);         
        //字节数  
        final int bytes = fieldValue.getBytes().length;  
        //字符数  
        final int chars = fieldValue.length();  
          
        if (mode.equals("none")){  
            //现在要求全是非中文字符  
            //所以字节数和字符数，两个数字必须相等，不相等则出错  
            if (chars!=bytes){  
                this.addFieldError(fieldName, object);  
            }  
        }else if(mode.equals("some")){  
            //现在要求包含有中文字符  
            //所以字节数与字节数必然不相等，相等则出错  
            //另外，如果字节数是字符数的2倍，表示全是中文字符，也出错  
            if (chars==bytes||chars*2==bytes){  
                this.addFieldError(fieldName, object);  
            }  
        }else if(mode.equals("all")){  
            //现在要求全是中文字符  
            //所以字节数应该是字符数的2倍，否则出错  
            if (chars*2!=bytes){  
                this.addFieldError(fieldName, object);  
            }  
        }  
    }  
}
